package util;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class RegisForJdbc {

    private static DataSource ds;

    /**
     * 定义一个静态代码块 在类调用时执行
     */ static {
         // 创建一个properties的对象，用来对properties文件的操作
        Properties pro = new Properties();

        try {
            // 加载properties文件，方法中加载的是输入流，传递的是文件的相对路径
            pro.load( RegisForJdbc.class.getResourceAsStream("/JdbcPro.properties"));
            // 将配置文件加载进去，通过阿里巴巴druid连接池传回一个连接池对象
            ds= DruidDataSourceFactory.createDataSource(pro);

        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 定义一个方法 对数据库进行连接
     * @return 返回一个连接对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        // 通过数据库连接池中的方法 ， 返回一个连接池对象
        return ds.getConnection();
    }

    /**
     * 定义一个方法 对于数据库资源的释放 (三种)，释放的类是从子到父排序
     * @param conn
     * @param stat
     * @param rs
     */
    public static void close(ResultSet rs,Statement stat,Connection conn){
        // 传入三个对象，分别对其释放资源，首先判断是否为空
        if( rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if( stat!=null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if( conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 定义一个方法 对资源进行释放 (两种)
     * @param conn
     * @param stat
     */
    public static void close(Statement stat,Connection conn ){
        // 调用close方法，减少代码的冗余率
      close(null,stat,conn);
    }

    public static DataSource getDataSource(){
        return ds;
    }   // 返回一个数据库连接池对象

}
